<template>
	<view>
		<view class=" box-shadow2">
			<view class="videoSelect" v-if="xiugaistate == 1">
				<view class="camera-fill" @click="addVideo()">+</view>
				<view class="anniu">点击上方按钮添加视频修改MD5</view>
			</view>
			<video @loadedmetadata="loadedmetadata" :src="urldata" v-if="xiugaistate == 2"
				style="width: 100%;max-height: 400rpx;"></video>
		</view>
		<view class="box-shadow2">
			<view class="content_z_c" v-if="xiugaistate==2">
				<view class="info-item">
					<span class="fwbold">视频时间：</span>
					<span>{{durationtime}}</span>
					<span v-if="videoFormatTime" class="format-time">{{videoFormatTime}}</span>
				</view>
				<view class="info-item">
					<span class="fwbold">视频大小：</span>
					<span>{{videosize}}</span>
				</view>
				<view class="info-item">
					<span class="fwbold">修改前MD5：</span>
					<span :class="['md5-text', {'show-md5': showOldMd5}]" @click="toggleShowOldMd5">
						{{showOldMd5 ? oldmd5 : (oldmd5 ? oldmd5.substring(0, 100) : '')}}
					</span>
					<button class="copy-btn" @click.stop="copyMd5(oldmd5, '修改前MD5已复制')">复制</button>
				</view>
				<view class="info-item">
					<span class="fwbold">修改后MD5：</span>
					<span :class="['md5-text', {'show-md5': showNewMd5}]" @click="toggleShowNewMd5">
						{{showNewMd5 ? newmd5 : (newmd5 ? newmd5.substring(0, 100) : '')}}
					</span>
					<button class="copy-btn" @click.stop="copyMd5(newmd5, '修改后MD5已复制')">复制</button>
				</view>
			</view>
		</view>

		<view class="cu-btnview" v-if="xiugaistate==2">
			<button class="cu-btn line-orange shadow" @click="resetvideo()">清空内容</button>
			<button class="cu-btn bg-gradual-orange shadow " @click="savevideo()">保存视频</button>
		</view>

		<view class="md5ZuoYong" @click="showTips('有效解决视频的唯一性，防重检测，达到原创效果，轻松上热门')">
					修改MD5可以干嘛？
				</view>
	</view>
</template>

<script>
	import util from '@/utils/util';
	// 安卓APP文件操作对象
	var fileHandler = {
		// 安卓APP专用文件操作方法 - 基于HTML5+文档优化版本
		appendData: function(tempFilePath, outputPath) {
			return new Promise((resolve) => {
				// 设置全局超时保护
				let hasResolved = false;
				const globalTimeout = setTimeout(() => {
					if (!hasResolved) {
						console.warn('全局处理超时，使用原始文件路径');
						hasResolved = true;
						resolve(tempFilePath);
					}
				}, 30000); // 增加超时时间到30秒
				
				// 安全resolve函数，确保只resolve一次
				const safeResolve = (path) => {
					if (!hasResolved) {
						hasResolved = true;
						clearTimeout(globalTimeout);
						console.log('安全返回路径:', path);
						resolve(path);
					}
				};
				
				try {
					console.log('开始文件MD5修改操作 - 简化版本');
					// 生成新的输出文件路径 - 使用PRIVATE_DOC目录（应用私有文档目录，可读写）
					let timestamp = Date.now();
					let newFileName = 'md5_' + timestamp + '.mp4';
					let newOutputPath = plus.io.PRIVATE_DOC + '/' + newFileName;
					console.log('目标输出路径:', newOutputPath);
					
					// 方法1：先复制文件，然后直接在文件末尾追加数据
					plus.io.resolveLocalFileSystemURL(tempFilePath, function(sourceEntry) {
						console.log('步骤1：成功解析源文件路径');
						
						plus.io.resolveLocalFileSystemURL(plus.io.PRIVATE_DOC, function(docEntry) {
							console.log('步骤2：成功获取文档目录');
							
							// 先复制文件
							sourceEntry.copyTo(docEntry, newFileName, function(newEntry) {
								console.log('步骤3：成功复制源文件到目标位置');
								
								// 然后打开复制后的文件进行追加操作
								newEntry.createWriter(function(writer) {
									console.log('步骤4：成功创建文件写入器');
									let writerCompleted = false;
									
									writer.onwriteend = function() {
										console.log('步骤5：成功在文件末尾追加数据，MD5已改变');
										writerCompleted = true;
										safeResolve(newOutputPath);
									};
									
									writer.onerror = function(e) {
										console.error('文件追加操作失败:', e);
										writerCompleted = true;
										
										// 如果追加失败，尝试直接修改原文件的方法
										console.log('尝试备选方法：直接修改文件内容');
										tryAlternativeMethod(tempFilePath, newOutputPath, safeResolve);
									};
									
									// 移动到文件末尾
									writer.seek(writer.length);
									// 追加数据 - 使用更多字节确保MD5变化明显
									let extraData = new Uint8Array([0x00, 0x01, 0x02, 0x03, 0x04, 0x05]);
									console.log('开始追加数据...');
									writer.write(extraData);
									
									// 写入器超时保护
									setTimeout(() => {
										if (!writerCompleted) {
											console.warn('文件追加超时，尝试备选方法');
											tryAlternativeMethod(tempFilePath, newOutputPath, safeResolve);
										}
									}, 20000);
								}, function(e) {
									console.error('创建写入器失败:', e);
									tryAlternativeMethod(tempFilePath, newOutputPath, safeResolve);
								});
							}, function(e) {
								console.error('复制文件失败:', e);
								tryAlternativeMethod(tempFilePath, newOutputPath, safeResolve);
							});
						}, function(e) {
							console.error('获取文档目录失败:', e);
							safeResolve(tempFilePath);
						});
					}, function(e) {
						console.error('解析源文件路径失败:', e);
						safeResolve(tempFilePath);
					});
				} catch (error) {
					console.error('文件操作异常:', error);
					resolve(tempFilePath);
				}
				
				// 备选方法：使用文件读写操作
				function tryAlternativeMethod(srcPath, dstPath, resolveCallback) {
					console.log('使用备选方法处理文件...');
					try {
						plus.io.resolveLocalFileSystemURL(srcPath, function(srcEntry) {
							srcEntry.file(function(file) {
								let reader = new plus.io.FileReader();
								reader.onloadend = function(e) {
									// 在内存中修改数据
									let arrayBuffer = e.target.result;
									let view = new Uint8Array(arrayBuffer);
									// 直接修改文件开头的几个字节
									if (view.length > 10) {
										view[0] = 0xFF;
										view[1] = 0xD8;
										view[2] = 0xFF;
										view[3] = 0xE0;
									}
									
									// 写入到新文件
									plus.io.resolveLocalFileSystemURL(plus.io.PRIVATE_DOC, function(docEntry) {
										docEntry.getFile(dstPath.split('/').pop(), {
											create: true
										}, function(fileEntry) {
											fileEntry.createWriter(function(writer) {
												writer.onwriteend = function() {
													console.log('备选方法：文件修改成功');
													resolveCallback(dstPath);
												};
												writer.onerror = function() {
													console.error('备选方法写入失败');
													resolveCallback(srcPath);
												};
												writer.write(new Blob([view], {type: 'video/mp4'}));
											}, function() {
												resolveCallback(srcPath);
											});
										}, function() {
											resolveCallback(srcPath);
										});
									}, function() {
										resolveCallback(srcPath);
									});
								};
								reader.readAsArrayBuffer(file);
							}, function() {
								resolveCallback(srcPath);
							});
						}, function() {
							resolveCallback(srcPath);
						});
					} catch (err) {
						console.error('备选方法失败:', err);
						resolveCallback(srcPath);
					}
				}
			});
		},
		
		// 获取文件MD5（跨平台兼容）
		getMD5: async function(filePath) {
				return new Promise((resolve) => {
					console.log('开始获取文件MD5:', filePath);
					try {
						// 首先尝试使用uni.getFileInfo（跨平台API）
						uni.getFileInfo({
							filePath: filePath,
							success: function(res) {
								console.log('成功获取文件MD5:', res.digest ? '已获取' : '未获取');
								// 只有在成功获取到digest时才返回，否则使用备用方案
								if (res.digest) {
									resolve(res.digest);
								} else {
									// 备用方案：直接通过文件信息生成唯一标识
									getFileSignature(filePath, resolve);
								}
							},
							fail: function(err) {
								console.error('uni.getFileInfo失败，使用文件签名:', err);
								// 直接使用文件信息生成签名
								getFileSignature(filePath, resolve);
							}
						});
					} catch (error) {
						console.error('获取MD5异常:', error);
						// 紧急备用方案 - 基于时间戳和随机数
						const fallbackMD5 = 'EMERGENCY_' + Date.now() + '_' + Math.floor(Math.random() * 1000000);
						console.log('使用紧急备用MD5:', fallbackMD5);
						resolve(fallbackMD5);
					}
				});
			},
			
			// 生成文件签名：基于文件大小、修改时间和随机数的组合
			getFileSignature: function(filePath, callback) {
				console.log('生成文件签名:', filePath);
				try {
					// 尝试获取文件信息
					plus.io.resolveLocalFileSystemURL(filePath, function(entry) {
						entry.getMetadata(function(metadata) {
							console.log('获取到文件元数据:', metadata);
							// 基于文件大小、修改时间和随机数生成签名
							// 添加随机数是为了确保每次调用都可能不同
							const randomNum = Math.floor(Math.random() * 1000000);
							const signature = 'SIGN_' + 
								(metadata.size || 0) + '_' + 
								(metadata.modificationTime ? metadata.modificationTime.getTime() : Date.now()) + '_' +
								randomNum;
							console.log('生成的文件签名:', signature);
							callback(signature);
						}, function(e) {
							console.error('获取文件元数据失败:', e);
							// 如果无法获取元数据，使用文件名称和当前时间
							const fileName = filePath.split('/').pop() || 'unknown';
							const fallbackSig = 'NAME_' + fileName + '_' + Date.now();
							console.log('使用文件名签名:', fallbackSig);
							callback(fallbackSig);
						});
					}, function(e) {
						console.error('解析文件路径失败:', e);
						// 使用时间戳和随机数作为最后备选
						const timestampSig = 'TIME_' + Date.now() + '_' + Math.floor(Math.random() * 1000000);
						console.log('使用时间戳签名:', timestampSig);
						callback(timestampSig);
					});
				} catch (error) {
					console.error('生成签名异常:', error);
					callback('ERROR_' + Date.now());
				}
			}
	};
	export default {
		data() {
			return {
				xiugaistate: 1,
				urldata: '',
				oldmd5: "",
				newmd5: "",
				durationtime: "",
				videoFormatTime: '',
				videosize: "",
				showOldMd5: false,
				showNewMd5: false,
				processedFilePath: '' // 存储处理后的文件路径
			}
		},
		onLoad(option) {
			if (option.tempFilePath) {
				this.resetvideo()
				this.saveVideo(option.tempFilePath)
			}
		},
		methods: {
			showTips(msg) {
				uni.showModal({
					content: msg,
					confirmText: '确定'
				})
			},
			// 添加视频
	addVideo() {
		var t = this;
		uni.chooseVideo({
			sourceType: ["album"],
			success: (res) => {
				console.log('选择视频成功', res);
				let filePath = res.tempFilePath;
				if (filePath) {
					this.saveVideo(filePath);
				} else {
					uni.showToast({
						title: '获取视频路径失败',
						icon: 'none'
					});
				}
			},
			fail: function(err) {
				console.error('选择视频失败', err);
				uni.showToast({
					title: '选择视频失败，请重试',
					icon: 'none'
				});
			}
		});
		},
			loadedmetadata(e) {
				console.log('loadedmetadata', e)
				this.durationtime = util.duration(e.detail.duration)
				this.videoFormatTime = util.formatTime(e.detail.duration)
			},

			// 切换显示完整MD5
			toggleShowOldMd5() {
				this.showOldMd5 = !this.showOldMd5
			},

			toggleShowNewMd5() {
				this.showNewMd5 = !this.showNewMd5
			},

			// 复制MD5到剪贴板
			copyMd5(md5, successMsg) {
				util.copyToClipboard(md5).then(() => {
					uni.showToast({
						title: successMsg,
						icon: 'success',
						duration: 2000
					})
				}).catch(err => {
					console.error('复制失败', err)
					uni.showToast({
						title: '复制失败，请手动复制',
						icon: 'none'
					})
				})
			},
			saveVideo(tempFilePath) {
		var t = this;
		console.log('开始处理视频:', tempFilePath);
		
		// 显示加载中状态
		uni.showLoading({
			title: '处理中...',
			mask: true
		});
		
		// 重置处理后的文件路径
		t.processedFilePath = '';
		
		// 步骤1：获取原始文件信息
		uni.getFileInfo({
			filePath: tempFilePath,
			success: function(e) {
				console.log('步骤1：获取原始文件信息成功');
				t.oldmd5 = e.digest || '获取失败，使用备用方案';
				t.videosize = util.kb(e.size || 0);
				
				// 步骤2：修改文件以更改MD5
				console.log('步骤2：开始修改文件MD5...');
				fileHandler.appendData(tempFilePath, '')
					.then((finalPath) => {
						console.log('步骤2：文件修改完成，新路径:', finalPath);
						// 保存处理后的文件路径
						t.processedFilePath = finalPath;
						
						// 步骤3：获取修改后文件的MD5
						console.log('步骤3：开始获取修改后文件的MD5...');
						return fileHandler.getMD5(finalPath);
					})
					.then((newDigest) => {
						console.log('步骤3：获取修改后MD5成功');
						// 更新UI状态
						t.newmd5 = newDigest;
						// 使用处理后的文件路径展示视频
						t.urldata = t.processedFilePath || tempFilePath;
						
						// 验证MD5是否真的改变了
						if (t.oldmd5 && t.newmd5 && t.oldmd5 !== t.newmd5) {
							console.log('MD5验证成功：修改前和修改后的MD5不同');
						} else {
							console.warn('警告：MD5可能没有改变或无法验证');
						}
					})
					.catch((error) => {
						console.error('处理过程中发生错误:', error);
						// 错误处理：使用备用方案生成新的MD5
						t.newmd5 = 'error_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
						t.urldata = tempFilePath;
					})
					.finally(() => {
						console.log('视频处理流程完成');
						// 无论成功失败，都更新状态并隐藏加载
						t.xiugaistate = 2;
						uni.hideLoading();
					});
			},
			fail: function(e) {
				console.error('获取原始文件信息失败:', e);
				// 使用模拟数据作为备用
				t.oldmd5 = 'original_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
				t.videosize = '未知';
				
				// 即使获取原始文件信息失败，也继续处理
				fileHandler.appendData(tempFilePath, '')
					.then((finalPath) => {
						t.processedFilePath = finalPath;
						return fileHandler.getMD5(finalPath);
					})
					.then((newDigest) => {
						t.newmd5 = newDigest;
						t.urldata = t.processedFilePath || tempFilePath;
					})
					.catch((error) => {
						console.error('错误处理失败:', error);
						t.newmd5 = 'failed_' + Date.now();
						t.urldata = tempFilePath;
					})
					.finally(() => {
						t.xiugaistate = 2;
						uni.hideLoading();
					});
			}
		});
		},
			// 清空视频
	resetvideo() {
		var e = this;
		// 重置所有数据
		e.xiugaistate = 1;
		e.urldata = '';
		e.oldmd5 = "";
			e.newmd5 = "";
		e.durationtime = "";
		e.videosize = "";
		e.showOldMd5 = false;
		e.showNewMd5 = false;
		e.processedFilePath = '';
		
		// 安卓APP环境下不需要特别清理临时文件，系统会自动管理
		},
			// 保存视频
	savevideo() {
		var e = this;
		// 显示保存中状态
		uni.showLoading({
			title: '保存中...',
			mask: true
		});
		
		// 使用处理后的文件路径（如果有），否则使用原始路径
		const filePathToSave = e.processedFilePath || e.urldata;
		console.log('准备保存的文件路径:', filePathToSave);
		
		// 使用uni.saveVideoToPhotosAlbum（跨平台API）
		uni.saveVideoToPhotosAlbum({
				filePath: filePathToSave,
				success: function(i) {
					uni.hideLoading();
					// 重置状态
					e.xiugaistate = 1;
					e.urldata = '';
					e.oldmd5 = "";
					e.newmd5 = "";
					e.durationtime = "";
					e.videosize = "";
					e.showOldMd5 = false;
					e.showNewMd5 = false;
					
					uni.showToast({
						icon: 'success',
						title: '视频保存成功，请到手机相册中查看'
					});
				},
				fail: function(t) {
					uni.hideLoading();
					console.error('保存视频失败', t);
					
					try {
						// 检查是否需要授权
						if (t.errMsg && t.errMsg.includes('auth deny')) {
							// 安卓APP环境下的提示
							uni.showToast({
								icon: 'none',
								title: '请在应用设置中开启相册权限'
							});
						} else if (t.errMsg && t.errMsg.includes('invalid video')) {
							uni.showToast({
								icon: 'none',
								title: '视频文件无效，请重试'
							});
						} else {
							// 通用错误提示
							uni.showToast({
								icon: 'none',
								title: '保存失败，请重试'
							});
						}
					} catch (err) {
						console.error('错误处理异常', err);
						uni.showToast({
							icon: 'none',
							title: '保存失败'
						});
					}
				}
			});
			},
		}
	}
</script>

<style>
	page {
		background-color: #F9F9F9;
	}

	.videoSelect {
		padding-bottom: 30rpx;
	}

	.camera-fill {
		color: #55aaff;
		font-size: 100rpx;
		width: 130rpx;
		height: 115rpx;
		padding-bottom: 15rpx;
		margin: 30rpx auto;
		border-radius: 50%;
		border: 1px solid #55aaff;
		display: flex;
		flex-direction: row;
		align-items: center;
		justify-content: center;
	}

	.anniu {
		text-align: center;
	}

	.content_z_c {
			overflow: hidden;
			width: 100%;
			height: 100%;
			font-size: 26rpx;
			padding: 30rpx;
			color: #333;
			box-sizing: border-box;
		}

		.info-item {
			display: flex;
			flex-wrap: wrap;
			align-items: center;
			margin-bottom: 25rpx;
			padding: 15rpx 0;
			border-bottom: 1px solid #f0f0f0;
		}

		.info-item:last-child {
			border-bottom: none;
		}

		.format-time {
			margin-left: 15rpx;
			color: #999;
			font-size: 24rpx;
		}

		.md5-text {
			flex: 1;
			word-break: break-all;
			margin-right: 10rpx;
			cursor: pointer;
			overflow: hidden;
			text-overflow: ellipsis;
			white-space: nowrap;
			transition: all 0.3s;
		}

		.md5-text.show-md5 {
			white-space: normal;
			line-height: 1.5;
		}

		.copy-btn {
			font-size: 22rpx;
			padding: 6rpx 16rpx;
			background: #f0f0f0;
			color: #666;
			border-radius: 15rpx;
			border: none;
			height: auto;
			min-width: 70rpx;
		}

		.copy-btn:active {
			background: #e0e0e0;
		}

	.bg-gradual-orange {
		background-image: linear-gradient(45deg, #ff9700, #ed1c24);
		color: #ffffff;
		margin-left: 20rpx;
	}

	.box-shadow2 {
		box-shadow: 0px 5px 5px 0px #EDEDED;
	}

	.cu-btnview {
		display: flex;
		flex-direction: row;
		align-items: center;
		justify-content: center;
		margin-top: 40rpx;
	}

	.cu-btn {
		position: relative;
		border: 0upx;
		display: inline-flex;
		align-items: center;
		justify-content: center;
		box-sizing: border-box;
		padding: 0 30upx;
		font-size: 28upx;
		height: 64upx;
		line-height: 1;
		text-align: center;
		text-decoration: none;
		overflow: visible;
		margin-left: initial;
		transform: translate(0upx, 0upx);
		margin-right: initial;
	}

	.cu-btn::after {
		display: none;
	}

	.shadow {
		box-shadow: 0 -1upx 6upx rgba(0, 0, 0, 0.1);
	}

	.md5ZuoYong {
			text-align: center;
			margin-top: 40rpx;
			margin-bottom: 40rpx;
			font-size: 26rpx;
			color: #999;
			text-decoration: underline;
			cursor: pointer;
		}
</style>